package com.ruoyi.express.third;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author chenck
 * @date 2019/3/9 14:19
 */
@Data
public class BaiduInput<T extends BaiduResult> {

    /**
     * 获取参数化泛型class
     */
    @SuppressWarnings("unchecked")
    public BaiduInput() {
        // 获取带有泛型的父类
        Type type = getClass().getGenericSuperclass();
        // 参数化泛型
        if (type instanceof ParameterizedType) {
            // 获取参数化类型的数组，可能有多个泛型
            Type[] p = ((ParameterizedType) type).getActualTypeArguments();
            // 此处只有一个泛型，故取第一个
            resultClazz = (Class<T>) p[0];
        }
    }

    /**
     * 请求目标url
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private String url;

    /**
     * 代理ip
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private String proxyHost;

    /**
     * 代理端口
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private int proxyPort;

    /**
     * 响应参数对应的class，用于反序列化
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private Class<T> resultClazz;
    /**
     * HTTP请求方式,默认get
     */
    @JsonIgnore
    @JSONField(serialize = false)
    private String method;

    /** url参数Map，用于url参数按照k=v拼接模式(JOIN)构建 */
    @JsonIgnore
    @JSONField(serialize = false)
    Map<String, Object> urlParamMap;

    @JSONField(serialize = false)
    public Map<String, Object> getUrlParamMap() {
        if(null == urlParamMap){
            urlParamMap = new TreeMap<String, Object>();
        }
        return urlParamMap;
    }

    /**
     * 添加URL参数到Map
     *
     * @param key
     * @param value
     * @return
     * @author chenck
     * @date 2016年12月16日 下午3:17:07
     */
    @JSONField(serialize = false)
    public BaiduInput<T> addUrlParam(String key, Object value) {
        this.getUrlParamMap().put(key, value);
        return this;
    }
}
